package cc.wfu.domain.order.repository;

import cc.common.types.entity.ProductActivityEntity;
import cc.wfu.domain.order.model.aggregate.CreateOrderAggregate;
import cc.wfu.domain.order.model.entity.PayOrderEntity;
import cc.wfu.domain.order.model.entity.ProductActivitySkuEntity;
import cc.wfu.domain.order.model.entity.ProductOrderEntity;
import cc.wfu.domain.order.model.entity.UnpaidOrderEntity;
import cc.wfu.domain.order.model.valobj.ActivitySkuStockKeyVO;

import java.util.Date;
import java.util.List;

/**
 * @Author: jia-qiang ljq1024.cc
 * @desc: 活动仓储接口
 * @Date: 2024-06-05-22:26
 */
public interface IProductActivityRepository {

    /** 通过sku查询sku信息 */
    ProductActivitySkuEntity queryActivitySku(Long sku);

    /**
     * 缓存 sku库存
     * @param sku sku
     * @param stockCount sku 库存
     */
    void cacheActivitySkuStockCount(Long sku, Integer stockCount);

    /**
     * 预热活动【查询时预热到缓存】
     * @param productId 商品ID
     */
    ProductActivityEntity queryProductActivityByProductId(Long productId);


    /**
     * 根据商品ID，扣减奖品缓存库存
     * @param activitySkuStockKeyVO 互动SKU
     * @param endDateTime 活动结束时间，根据结束时间设置加锁的key为结束时间
     */
    boolean subtractionActivitySkuStock(ActivitySkuStockKeyVO activitySkuStockKeyVO, Date endDateTime);

    /** 写入延迟队列，延迟消费更新库存记录 */
    void activitySkuStockConsumeSendQueue(ActivitySkuStockKeyVO activitySkuStockKeyVO);

    /**
     * 保存订单
     * @param createOrderAggregate 订单聚合对象
     */
    void doSaveOrder(CreateOrderAggregate createOrderAggregate);

    /**
     * 清空商品sku库存
     * @param sku sku
     */
    void clearActivitySkuStock(Long sku);


    /** 从延迟队列中获取信息 */
    ActivitySkuStockKeyVO takeQueueValue();

    /**
     * 延迟队列 + 任务 趋势更新活动sku库存
     *
     * @param sku 活动商品
     */
    void updateActivitySkuStock(Long sku);

    /** 超时关单 */
    boolean changeOrderClose(String orderId);

    /**
     * 查询超时订单列表
     * @return 超时订单单号列表
     */
    List<String> queryTimeoutCloseOrderList();

    /**
     * 查询有效期内，未接收到支付回调的订单
     */
    List<String> queryNoPayNotifyOrder();

    /**
     * 查询待补货订单
     */
    List<String> queryReplenishmentOrder();

    /**
     * 订单商品发货
     * @param orderId 订单ID
     */
    void deliverGoods(String orderId);

    /** 查询未支付订单 */
    UnpaidOrderEntity queryUnpaidOrder(CreateOrderAggregate createOrderAggregate);

    /** 支付成功 - 更新订单信息 */
    void updateOrderPayInfo(PayOrderEntity payOrderEntity);
}
